package PenTest.kedaxunfei.ACM0727;

import java.util.*;

/**
 * <p>
 * <p/>
 *
 * @author zhangchengwei1
 * @since 2024/7/29/周一 17:09
 */
public class ACM01 {

    /**
     * 小强有n个朋友，每个朋友有一定数量的金币，现在他们要购买房子，一共有m个房子，每个房子有两个参数：舒适度和价格，
     * 当一个人的金币大于等于一个房子的价格时，才可以购买房子，且要满足以下条件：
     * 1.一个人至多购买一个房子。
     * 2.一个房子至多被一个人购买。现在小强想知道n个朋友购买的房子的舒适度之和最大可能是多少？
     * 输入描述
     * 第一行两个整数n,m 接下来一行n个数，第i个整数x表示第i个人的金币x, 1<=x<=10^9 接下来m行每行两个整数表示每个房子的舒适度a和价格b，1<=a,b<=10^9,1<=n,m<=2*10^5
     *
     * 输出描述
     *
     * 输出一个数表示最大可能的舒适度之和
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        int m=scanner.nextInt();
        scanner.nextLine();
        String[] s = scanner.nextLine().split(" ");
        TreeMap<Integer, Integer> friends = new TreeMap<>();
        for (int i = 0; i < s.length; i++) {
            Integer key=Integer.valueOf(s[i]);
            friends.put(key, friends.getOrDefault(key, 0) + 1);
        }

        List<List<Integer>> houses = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            String[] ss = scanner.nextLine().split(" ");//0是
            List<Integer> list1 = new ArrayList<>();
            list1.add(Integer.parseInt(ss[0]));
            list1.add(Integer.parseInt(ss[1]));
            houses.add(list1);
        }
        houses.sort((o1, o2) -> o2.get(1)-o1.get(1));
        long maxComfortSum=0;
        for(List<Integer> house:houses){
            Map.Entry<Integer,Integer> entry=friends.ceilingEntry(house.get(1));//取金额数大于等于当前房子单价的最小值，
            maxComfortSum += house.get(0);
            Integer count=entry.getValue();
            if (count==1){
                friends.remove(entry.getKey());
            }else {
                friends.put(entry.getKey(), count - 1);
            }
        }

        System.out.print(maxComfortSum);
    }
}
